package main

import (
	"fmt"
	"gitee.com/miyula/cloud-native-training/module2/middleware"
	"github.com/gin-gonic/gin"
	"github.com/pkg/errors"
	"io"
	"log"
	"net/http"
	"os"
	"time"
)

func main() {

	var (
		port      = 80 // 使用端口80
		logFolder = "log/module2"
	)

	// 配置输出方式：屏幕输出+日志
	if err := initGinLog(logFolder); err != nil {
		panic(err)
	}

	// 使用Gin配置启动http server
	r := gin.New()

	//////// 配置中间件 ///////
	// 用于记录访问日志
	r.Use(gin.LoggerWithFormatter(middleware.LogResult))

	// 恢复重启用
	r.Use(gin.Recovery())

	// 用于每个请求原样返回header
	r.Use(middleware.ReturnHeader)

	// 用于返回环境变量中的VERSION信息，在header中返回
	r.Use(middleware.ReturnVersionInHeader)

	// 挂载路径 /healthz
	r.GET("/healthz", func(ctx *gin.Context) {

		// 返回状态200，并输出当前系统时间戳
		ctx.String(http.StatusOK, "%v", time.Now().UnixNano())
	})

	// 启动服务器
	if err := r.Run(fmt.Sprintf(":%d", port)); err != nil {
		panic(err)
	}

}

func initGinLog(folder string) error {
	if err := os.MkdirAll(folder, os.ModePerm); err != nil {
		return errors.Wrapf(err, "初始化日志文件夹%s失败", folder)
	}
	logName := fmt.Sprintf("%s/main_%s.log", folder, time.Now().Format("20060102150405"))
	logFile, fileErr := os.OpenFile(logName, os.O_WRONLY|os.O_CREATE|os.O_SYNC|os.O_APPEND, 0755)
	if fileErr != nil {
		return errors.Wrapf(fileErr, "初始化日志文件%s失败", logName)
	}
	writers := []io.Writer{
		logFile,
		os.Stdout,
	}
	gin.DefaultWriter = io.MultiWriter(writers...)
	log.SetOutput(gin.DefaultWriter)

	return nil
}
